package gestorvideoclub;

import gestorvideoclub.enumeraciones.*;
import gestorvideoclub.jdbc.*;
import gestorvideoclub.util.*;
import java.util.*;
import java.util.regex.Pattern;

/**
 * Genera el sistema de menús por consola:
 *  - Impresión de menús
 *  - Control de la funcionalidad de cada apartado
 *  - Implementación de la funcionalidad
 *  - Métodos auxiliares
 *
 * @author GRUPO
 */
public class Menu {

    // Control del aspecto de los menús
    private static String tab = "   ";  // Tabulación de los menús

    /************************************************************************
     * IMPRESION DE MENUS
     ************************************************************************/
    /**
     * Imprime el menú de inicio de la aplicación que identifica la franquicia
     */
    public static void imprimeMenuRun() {
        System.out.println();
        System.out.println("╔════════==══════════╗");
        System.out.println("  Aplicación Videoclub iniciada");
        System.out.println("╚═════════==═════════╝");
        System.out.print(">>> Introduzca código de franquicia: ");
    }

    /**
     * Imprime el menú inical donde seleccionamos el sistema a usar: cajero o tienda
     */
    public static void imprimeMenuInicial() {
        System.out.println();
        System.out.println("| VideoClub |");
        System.out.println("╔═══════════╗");
        System.out.println(tab + "[0] Terminar");
        System.out.println(tab + "[1] Cajero");
        System.out.println(tab + "[2] Tienda");
        System.out.println("╚═══════════╝");
        System.out.print(">>> Seleccione un programa: ");
    }

    /**
     * Imprime el menú para el cajero
     */
    public static void imprimeMenuCajero() {

        int i = 1; // Comienzo de índice de menús

        System.out.println();
        System.out.println("| VideoClub [Cliente] <Cajero> |");
        System.out.println("╔══════════════════╗");
        System.out.println(tab + "[0] Terminar");
        i = menuCli(i);
        System.out.println("╚══════════════════╝");
        System.out.print(">>> Seleccione una opción: ");
    }

    /**
     * Imprime el menú para la tienda según el rol de usuario
     * 
     * @param rol Rol de usuario
     */
    public static void imprimeMenuTienda(Rol rol) {

        int i = 1; // Comienzo de índice de menús

        switch (rol) {
            case Cliente:               // Menú Cliente
                System.out.println();
                System.out.println("| VideoClub [Cliente] <Tienda> |");
                System.out.println("╔══════════════════╗");
                System.out.println(tab + "[0] Cerrar sesión");
                i = menuCli(i);
                System.out.println("╚══════════════════╝");
                System.out.print(">>> Seleccione una opción: ");
                break;
            case Administrador:         // Menú Administrador
                System.out.println();
                System.out.println("| VideoClub [Administrador] <Tienda> |");
                System.out.println("╔══════════════════════╗");
                System.out.println(tab + "[0] Cerrar sesión");
                i = menuCli(i);
                i = menuAdm(i);
                System.out.println("╚══════════════════════╝");
                System.out.print(">>> Seleccione una opción: ");
                break;
            case Jefe:                  // Menú Jefe
                System.out.println();
                System.out.println("| VideoClub [Jefe] <Tienda> |");
                System.out.println("╔══════════════════════╗");
                System.out.println(tab + "[0] Cerrar sesión");
                i = menuCli(i);
                i = menuAdm(i);
                i = menuJefe(i);
                System.out.println("╚══════════════════════╝");
                System.out.print(">>> Seleccione una opción: ");
                break;
            default:
            // 
        }
    }

    /**
     * Genera opciones del menú para Cliente
     *
     * @param i
     * @return último índice de menú usado
     */
    private static int menuCli(int i) {
        // TODO MIGUEL Distinguir entre Cajero y Tienda
        System.out.println(tab + "[" + i++ + "] Buscar producto"); // TODO MIGUEL Esto mejor dentro de Alquilar o poner aquí a modo de consultas de lo que hay...
        System.out.println(tab + "[" + i++ + "] Alquilar producto");
        // System.out.println(tab + "[" + i++ + "] Reservar producto"); // TODO MIGUEL Esto dentro de Alquilar si no es posible el alquiler
        System.out.println(tab + "[" + i++ + "] Devolver producto");
        System.out.println(tab + "[" + i++ + "] Consultar saldo");
        return i;
    }

    /**
     * Genera opciones adicionales del menú para Administrador
     * 
     * @param i
     * @return último índice de menú usado
     */
    private static int menuAdm(int i) {
        System.out.println(tab + "[" + i++ + "] Gestión usuarios [+]");
        System.out.println(tab + "[" + i++ + "] Gestión productos [+]");
        System.out.println(tab + "[" + i++ + "] Gestión alquileres [+]");
        System.out.println(tab + "[" + i++ + "] Gestión reservas [+]");
        System.out.println(tab + "[" + i++ + "] Gestión tarifas [+]");
        System.out.println(tab + "[" + i++ + "] Gestión proveedores [+]");
        //System.out.println(tab + "[" + i++ + "] Consultas [+]");
        return i;
    }

    /**
     * Genera opciones del menú para Administrador, submenú Gestión de usuarios
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuAdmUsu(int i) {
        System.out.println();
        System.out.println(" | Gestión usuarios");
        System.out.println("╔══════════════════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Buscar usuario");
        System.out.println(tab + "[" + i++ + "] Alta usuario");
        System.out.println(tab + "[" + i++ + "] Baja usuario");
        System.out.println(tab + "[" + i++ + "] Modificación usuario");
        System.out.println(tab + "[" + i++ + "] Desbloqueo usuario");
        System.out.println(tab + "[" + i++ + "] Añadir saldo");
        System.out.println(tab + "[" + i++ + "] Consultar saldo");
        System.out.println(tab + "[" + i++ + "] Ver reservas pendientes");
        System.out.println(tab + "[" + i++ + "] Lista de usuarios");
        System.out.println("╚══════════════════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Administrador, submenú Gestión de productos
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuAdmProd(int i) {
        System.out.println();
        System.out.println(" | Gestión productos");
        System.out.println("╔══════════════════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Alta producto");
        System.out.println(tab + "[" + i++ + "] Baja producto");
        System.out.println(tab + "[" + i++ + "] Modificación producto");
        System.out.println(tab + "[" + i++ + "] Stock de Productos");
        System.out.println("╚══════════════════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Administrador, submenú Gestión de alquileres
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuAdmAlq(int i) {
        System.out.println();
        System.out.println(" | Gestión alquileres");
        System.out.println("╔═══════════════===═══╗");
        System.out.println(tab + "[0] Volver");
//        System.out.println(tab + "[1] Alquiler");
//        System.out.println(tab + "[2] Reserva");
        System.out.println(tab + "[1] Ver productos alquilados");
        System.out.println("╚══════════════===════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Administrador, submenú Gestión de reservas
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuAdmReserv(int i) {
        System.out.println();
        System.out.println(" | Gestión reservas");
        System.out.println("╔═══════════════=======═══╗");
        System.out.println(tab + "[0] Volver");
//        System.out.println(tab + "[" + i++ + "] Alta reserva");
//        System.out.println(tab + "[" + i++ + "] Baja reserva");
//        System.out.println(tab + "[" + i++ + "] Modificación reserva");
        System.out.println(tab + "[" + i++ + "] Actualizar reservas");
        System.out.println(tab + "[" + i++ + "] Alquilar productos reservados");
        System.out.println("╚═══════════════=======═══╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Administrador, submenú Gestión de tarifas
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuAdmTar(int i) {
        System.out.println();
        System.out.println(" | Gestión tarifas");
        System.out.println("╔══════════════════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Alta tarifa");
        System.out.println(tab + "[" + i++ + "] Baja tarifa");
        System.out.println(tab + "[" + i++ + "] Modificación tarifa");
        System.out.println("╚══════════════════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Administrador, submenú Gestión de proveedores
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuAdmProv(int i) {
        System.out.println();
        System.out.println(" | Gestión proveedores");
        System.out.println("╔══════════════════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Alta proveedor");
        System.out.println(tab + "[" + i++ + "] Baja proveedor");
        System.out.println(tab + "[" + i++ + "] Modificación proveedor");
        System.out.println(tab + "[" + i++ + "] Consulta proveedor");
        System.out.println(tab + "[" + i++ + "] Listado proveedores");
        System.out.println("╚══════════════════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Administrador, submenú Gestión de consultas
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuAdmCons(int i) {
        System.out.println();
        System.out.println(" | Consultas");
        System.out.println("╔══════════════════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Estado usuario");
        System.out.println(tab + "[" + i++ + "] Estado producto");
        System.out.println(tab + "[" + i++ + "] Estado pedido");
        System.out.println(tab + "[" + i++ + "] Producto");
        System.out.println(tab + "[" + i++ + "] Reservas");
        System.out.println(tab + "[" + i++ + "] Búsqueda producto por género");
        System.out.println(tab + "[" + i++ + "] Búsqueda producto por nombre");
        System.out.println(tab + "[" + i++ + "] Tarifas");
        System.out.println("╚══════════════════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones adicionales del menú para Jefe
     *
     * @param i
     * @return último índice de menú usado
     */
    private static int menuJefe(int i) {
        System.out.println(tab + "[" + i++ + "] Gestión pedidos [+]");
        System.out.println(tab + "[" + i++ + "] Gestión franquicias [+]");
        System.out.println(tab + "[" + i++ + "] Informes [+]");
        return i;
    }

    /**
     * Genera opciones del menú para Jefe, submenú Gestión de pedidos
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuJefePed(int i) {
        System.out.println();
        System.out.println(" | Gestión pedidos");
        System.out.println("╔══════════════════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Hacer pedido");
        System.out.println(tab + "[" + i++ + "] Recepcionar pedido");
        System.out.println("╚══════════════════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Jefe, submenú Gestión de franquicias
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuJefeFranq(int i) {
        System.out.println();
        System.out.println(" | Gestión franquicias");
        System.out.println("╔═════════════===═════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Alta franquicia");
        System.out.println(tab + "[" + i++ + "] Baja franquicia");
        System.out.println(tab + "[" + i++ + "] Modificación franquicia");
        System.out.println("╚════════════════===══╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /**
     * Genera opciones del menú para Jefe, submenú informes
     *
     * @param i
     * @return último índice de menú usado
     */
    public static int menuJefeInf(int i) {
        System.out.println();
        System.out.println(" | Informes");
        System.out.println("╔════════════============================══════╗");
        System.out.println(tab + "[0] Volver");
        System.out.println(tab + "[" + i++ + "] Gastos del videoclub");
        //System.out.println(tab + "[" + i++ + "] Gastos de todos los videoclubs");
        System.out.println(tab + "[" + i++ + "] Beneficio del videoclub");
        System.out.println(tab + "[" + i++ + "] Beneficio Neto");
        System.out.println(tab + "[" + i++ + "] Listado de gastos y beneficios");
        //System.out.println(tab + "[" + i++ + "] Beneficio de todos los videoclubs");
        System.out.println(tab + "[" + i++ + "] Estadística: productos más alquilados");
        System.out.println(tab + "[" + i++ + "] Estadística: productos más alquilados por género");
        System.out.println(tab + "[" + i++ + "] Estadística: franquicias más rentables");
        System.out.println("╚══=====══════════=======================══════╝");
        System.out.print(">>> Seleccione una opción: ");
        return i;
    }

    /************************************************************************
     * CONTROL DE LA FUNCIONALIDAD
     *
     *  run
     *  menuInicial
     *      menuTienda
     *          menuCliente
     *          menuAdministrador
     *          menuJefe
     *      menuCajero
     ************************************************************************/
    /**
     * Inicio de la aplicación.
     * Identificación de la franquicia.
     */
    public static void run() {
        // TODO MIGUEL La franquicia se inicia con clave también?
        // TODO MIGUEL Mejor: reconoce franquicia por usuario/clave del administrador principal
        // TODO MIGUEL Atributo estático para registrar franquicia     

//        imprimeMenuRun();
//
//        int opMaq = -1;
//
//        do {
//            Menu.imprimeMenuInicial();                  // Imprimir menú inicial
//
//            opMaq = EntradaTextoStatic.leeEntero();     // Recoje opción
//
//            switch (opMaq) {
//                case 0: // Salida del programa
//                    System.out.print(">>> La aplicación ha sido cerrada.\n");
//                    opMaq = -1;
//                    break;
//                case 1: // Modo CAJERO
//                    menuCajero();
//                    break;
//                case 2: // Modo TIENDA
//                    menuTienda();
//                    break;
//                default:
//                    System.out.println(">>> La opción no es válida, pruebe de nuevo.\n");
//            }
//        } while (opMaq != -1);

        Menu.menuInicial();
    }

    /**
     * Menú de selección de aplicación: Cajero o Tienda.
     */
    public static void menuInicial() {
        int opMaq = -1;

        do {
            Menu.imprimeMenuInicial();                  // Imprimir menú inicial

            opMaq = introduceDatos.introduceEntero();

            switch (opMaq) {
                case 0: // Salida del programa
                    System.out.print("[i] La aplicación ha sido cerrada.\n");
                    opMaq = -1;
                    break;
                case 1: // Modo Cajero
                    menuCajero();
                    break;
                case 2: // Modo Tienda
                    menuTienda();
                    break;
                default:
                    System.out.print("[!] La opción no es válida, pruebe de nuevo.\n");
                    opMaq = 0;
            }
        } while (opMaq != -1);
    }

    /**
     * Menú de inicio para Tienda.
     * Redirige hacia el menú adecuado en función del rol.
     */
    public static void menuTienda() {
        // Login usuario aplicación

        Usuario usu;
        usu = Videoclub.identificaUsuario();    // Hasta que no tiene un usuario no sigue

        Rol rol = usu.getRol();                 // Obtiene rol de usuario

        int op = -1;

        do {                                    // Selección de menú según rol
            Menu.imprimeMenuTienda(rol);
            switch (rol) {
                case Cliente:       // Menú Cliente
                    op = menuCliente();
                    break;
                case Administrador: // Menú Administrador
                    op = menuAdministrador();
                    break;
                case Jefe:          // Menú Jefe
                    op = menuJefe();
                    break;
                default:
                //
            }
        } while (op != -1);
    }

    /**
     * Menú de inicio para Cajero     
     */
    public static void menuCajero() { // TODO MIGUEL Sólo para pruebas, ahora no funciona
        // Login cliente

        // TODO MIGUEL Hacer parte login usuario parecido a tienda

        int rol = 1; //TODO MIGUEL Cambiar a -1 modo pruebas
        Usuario usu;
        usu = Videoclub.identificaUsuario(); // Hasta que no tiene un usuario no sigue

        // TODO MIGUEL Comprobar rol de usuario para obtener rol

//        int op = -1;
//
//        do {
//            Menu.imprimeMenuCajero();
//            op = introduceDatos.introduceEntero();
//            switch (op) {
//                case 0: // Salida del programa
//                    System.out.print(">>> Su sesión ha sido cerrada.\n");
//                    op = -1;
//                    break;
//                default:
//                    System.out.println(">>> La opción no es válida, pruebe de nuevo.");
//            }
//        } while (op != -1);

        System.out.println("EN CONSTRUCCION");
    }

    /**
     * Menú de inicio para Cliente     
     */
    public static int menuCliente() {
        int op = -1;
        op = introduceDatos.introduceEntero();
        switch (op) {
            case 0: // Salida del programa
                System.out.print("[i] Su sesión ha sido cerrada.\n");
                op = -1;
                break;
            case 1: // Buscar producto
                buscar_prod();
                break;
            case 2: // Alquilar producto
                alq_prod();
                break;
//            case 3: // Reservar producto
//                res_prod();
//                break;
            case 3: // Devolver producto
                dev_prod();
                break;
            case 4: // Consultar saldo
                cons_saldo();
                break;
            default:
                System.out.print("[!] La opción no es válida, pruebe de nuevo.");
                op = 0;
        }
        return op;
    }

    /**
     * Menú de inicio para Administrador
     * @return
     */
    public static int menuAdministrador() {
        int op = -1;
        op = introduceDatos.introduceEntero();
        switch (op) {
            case 0: // Salida del programa
                System.out.print(">>> Su sesión ha sido cerrada.\n");
                op = -1;
                break;
            case 1: // Buscar producto
                buscar_prod();
                break;
            case 2: // Alquilar producto
                alq_prod();
                break;
//            case 3: // Reservar producto
//                res_prod();
//                break;
            case 3: // Devolver producto
                dev_prod();
                break;
            case 4: // Consulta saldo
                cons_saldo();
                break;
            case 5: // Submenu gestión usuarios
                op = menuAdministradorUsu();
                break;
            case 6: // Submenu gestión productos
                op = menuAdministradorProd();
                break;
            case 7: // Submenu gestión alquileres
                op = menuAdministradorAlq();
                break;
            case 8: // Submenu gestión reservas
                op = menuAdministradorReserv();
                break;
            case 9: // Submenu gestión tarifas
                op = menuAdministradorTar();
                break;
            case 10: // Submenú gestión proveedores
                op = menuAdministradorProv();
                break;
//            case 11: // Submenu consultas
//                op = menuAdministradorCons();
//                break;
            default:
                System.out.print("[!] La opción no es válida, pruebe de nuevo.\n");
                op = 0;
        }
        return op;
    }

    /**
     * Menú de para Administrador > Usuarios
     */
    public static int menuAdministradorUsu() {
        int op = -1;
        do {
            Menu.menuAdmUsu(1);
            op = introduceDatos.introduceEntero();
            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // Buscar usuario
                    buscar_usu();
                    break;
                case 2: // Alta usuario
                    alta_usu();
                    break;
                case 3: // Baja usuario
                    baja_usu();
                    break;
                case 4: // Modificación usuario
                    mod_usu();
                    break;
                case 5: // Desbloqueo usuario
                    desbloq_usu();
                    break;
                case 6: // Añadir saldo
                    anyadir_saldo_usu();
                    break;
                case 7: // Consultar saldo
                    cons_saldo_usu();
                    break;
                case 8: // Ver reservas pendientes
                    reservas_pendientes_usu();
                    break;
                case 9: // Listado clientes
                    listado_usu();
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menú de para Administrador > Productos
     */
    public static int menuAdministradorProd() {
        int op = -1;
        do {
            Menu.menuAdmProd(1);
            op = introduceDatos.introduceEntero();

            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // Alta producto
                    alta_prod();
                    break;
                case 2: // Baja producto
                    baja_prod();
                    break;
                case 3: // Modificación producto
                    mod_prod();
                    break;
                case 4: //Stock de Productos
                    stock_prod();
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menú de para Administrador > Alquileres
     */
    public static int menuAdministradorAlq() {
        int op = -1;
        do {
            Menu.menuAdmAlq(1);
            op = introduceDatos.introduceEntero();

            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
//                case 1: // Alquiler
//                    break;
//                case 2: // Reserva
//                    break;
                case 1: // Ver productos alquilados
                    prod_alq();
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menú de para Administrador > Reservas
     */
    public static int menuAdministradorReserv() {
        int op = -1;
        do {
            Menu.menuAdmReserv(1);
            op = introduceDatos.introduceEntero();

            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
//                case 1: // Alta reserva
//                    alta_reserv();
//                    break;
//                case 2: // Baja reserva
//                    baja_reserv();
//                    break;
//                case 3: // Modificación reserva
//                    mod_reserv();
//                    break;
                case 1: // Actualizar reservas
                    actualizarReservas();
                    break;
                case 2: // Alquilar productos reservados
                    alquilar_producto_reservado();
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menú de para Administrador > Tarifas
     */
    public static int menuAdministradorTar() {
        int op = -1;
        do {
            Menu.menuAdmTar(1);
            op = introduceDatos.introduceEntero();
            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // Alta tarifa
                    alta_tar();
                    break;
                case 2: // Baja tarifa
                    baja_tar();
                    break;
                case 3: // Modificación tarifa
                    mod_tar();
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menú de para Administrador > Proveedores
     */
    public static int menuAdministradorProv() {
        int op = -1;
        do {
            Menu.menuAdmProv(1);
            op = introduceDatos.introduceEntero();

            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // Alta proveedor
                    alta_prov();
                    break;
                case 2: // Baja proveedor
                    baja_prov();
                    break;
                case 3: // Modificación proveedor
                    mod_prov();
                    break;
                case 4: // Consuta proveedor
                    cons_prov();
                    break;
                case 5: // Lista proveedores
                    lista_prov();
                    break;
                case 6: // Búsqueda x género

                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menú de para Administrador > Consultas
     */
    public static int menuAdministradorCons() {
        int op = -1;
        do {
            Menu.menuAdmCons(1);
            op = introduceDatos.introduceEntero();

//        System.out.println(tab + "[" + i++ + "] Estado usuario");
//        System.out.println(tab + "[" + i++ + "] Estado producto");
//        System.out.println(tab + "[" + i++ + "] Estado pedido");
//        System.out.println(tab + "[" + i++ + "] Producto");
//        System.out.println(tab + "[" + i++ + "] Reservas");
//        System.out.println(tab + "[" + i++ + "] Búsqueda producto por género");
//        System.out.println(tab + "[" + i++ + "] Búsqueda producto por nombre");
//        System.out.println(tab + "[" + i++ + "] Tarifas");

            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // 

                    break;
                case 2: // 

                    break;
                case 3: // 

                    break;
                case 4: // 

                    break;
                case 5: // 

                    break;
                case 6: // 

                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menu de inicio para Jefe
     * @return
     */
    public static int menuJefe() {
        int op = -1;
        op = introduceDatos.introduceEntero();
        switch (op) {
            case 0: // Salida del programa
                System.out.print(">>> Su sesión ha sido cerrada.\n");
                op = -1;
                break;
            case 1: // Buscar producto
                buscar_prod();
                break;
            case 2: // Alquilar producto
                alq_prod();
                break;
            case 3: // Devolver producto
                dev_prod();
                break;
            case 4: // Consulta saldo
                //cons_saldo();
                break;
            case 5: // Submenu gestión usuarios
                op = menuAdministradorUsu();
                break;
            case 6: // Submenu gestión productos
                op = menuAdministradorProd();
                break;
            case 7: // Submenu gestión alquileres
                op = menuAdministradorAlq();
                break;
            case 8: // Submenu gestión reservas
                op = menuAdministradorReserv();
                break;
            case 9: // Submenu gestión tarifas
                op = menuAdministradorTar();
                break;
            case 10: // Submenú gestión proveedores
                op = menuAdministradorProv();
                break;
//            case 11: // Submenu consultas
//                op = menuAdministradorCons();
//                break;
            case 11: // Submenu gestión pedidos
                op = menuJefePed();
                break;
            case 12: // Submenu gestión franquicias
                op = menuJefeFranq();
                break;
            case 13: // Submenu informes
                op = menuJefeInf();
                break;
            default:
                System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                op = 0;
        }
        return op;
    }

    /**
     * Menu para Jefe > Pedidos
     * @return 
     */
    public static int menuJefePed() {
        int op = -1;
        do {
            Menu.menuJefePed(1);
            op = introduceDatos.introduceEntero();

            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // Hacer pedido
                    alta_ped();
                    break;
                case 2: // Recepcionar pedido
                    recep_ped();
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menu para Jefe > Franquicias
     * @return 
     */
    public static int menuJefeFranq() {
        int op = -1;
        do {
            Menu.menuJefeFranq(1);
            op = introduceDatos.introduceEntero();
            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // Alta franquicia

                    break;
                case 2: // Baja franquicia

                    break;
                case 3: // Modificación franquicia

                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /**
     * Menu para Jefe > Informes
     * @return 
     */
    public static int menuJefeInf() {
        int op = -1;
        do {
            Menu.menuJefeInf(1);
            op = introduceDatos.introduceEntero();
            switch (op) {
                case 0: // Vuelta atrás
                    op = -1;
                    break;
                case 1: // Gastos del videoclub
                    obtenerGastos();
                    break;
                case 2:// Beneficios
                    obtenerIngresos();
                    break;
                case 3: // Gastos y beneficios detallados
                    obtener_beneficios_totales();
                    break;
                case 4: // Beneficios netos
                    obtenerDetallesContabilidad();
                    break;
                case 5: // Añade funciones menu Administrador
                    op = menuAdministrador();
                    break;
                case 6: // Añade funciones menu Jefe
                    op = menuJefe();
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
                    op = 0;
            }
        } while (op != -1);
        return op = -2;
    }

    /************************************************************************
     * FUNCIONALIDAD
     ************************************************************************/
    //*********************************************************    
    //  Cliente
    //*********************************************************
    /**
     * Buscar producto
     * @author rafa
     */
    private static void buscar_prod() {
        int op = 0;
        do {
            System.out.println("[1] Película");
            System.out.println("[2] Videojuego");
            System.out.print(">>> Seleccione tipo de producto: ");
            op = introduceDatos.introduceEntero();
        } while (op > 2 || op < 1);
        switch (op) {
            case 1:
                Pelicula.menuBuscaPelicula();
                break;
            case 2:
                Videojuego.menuBuscaVideojuego();
                break;
        }
    }

    /**
     * Alquilar producto
     */
    private static void alq_prod() {
        Cliente cliente;
        Producto prod;
        Alquiler alquiler;

        String dni;

        int opUsu = -1;                                                                     // Selección de usuario
        do {
            System.out.print(">>> Usuario que alquila: ");
            dni = EntradaTextoStatic.leeCadena();
            if (!UsuarioJDBC.existeUsuario(dni)) {                                          // No existe el usuario
                System.out.println("[!] El usuario no existe.");
                if (!utilidades.seguirSiNo()) {                                             // Pedir usuario de nuevo
                    opUsu = 0;
                }
            } else {                                                                        // Existe el usuario
                cliente = ClienteJDBC.obtenerClientePorDni(dni);
                if (cliente != null) {
                    if (cliente.getEstadoUsuario() == EstadoUsuario.Alta) {                 // El usuario puede alquilar
                        if (cliente.getNumProdAlqActual() < Cliente.getNumMaxProducto()) {  // Comprueba número máximo de artículos

                            opUsu = 0;
                            System.out.println("[i] Nombre de usuario: " + cliente.getNombre() + "\n");
                            //reservar está inicialmente a true
                            // ya que suponemos que no está disponible
                            Iterator it;
                            boolean salir = false;
                            boolean correcto = false;
                            boolean reservar = false;
                            List listaProducto;
                            int opProd = -1;                                                // Selección tipo de producto
                            do {
                                System.out.println(">>> Tipo de producto a alquilar:");
                                System.out.println("[0] Terminar");
                                System.out.println("[1] Alquilar Película");
                                System.out.println("[2] Alquilar Videojuego");
                                System.out.print(">>> Seleccione una opción: ");
                                opProd = introduceDatos.introduceEntero();
                                switch (opProd) {
                                    case 0: // Terminar
                                        opProd = -1;
                                        break;
                                    //////////////////////////ALQUILER DE PELICULA
                                    case 1: // Alquilar película

                                        System.out.print("Introduzca el nombre de la película que desea alquilar(Introduzca 0 para salir): ");
                                        String texto = introduceDatos.introduceString();
                                        System.out.println();
                                        if (texto.length() > 0 && !texto.equals("0")) {
                                            listaProducto = (ArrayList) PeliculaJDBC.consultaPeliculasNombre(texto);
                                            if (!listaProducto.isEmpty()) {
                                                it = listaProducto.iterator();
                                                Pelicula pelicula = new Pelicula();
                                                int i = 1;
                                                while (it.hasNext()) {
                                                    System.out.print(">> PELÍCULA NÚMERO: " + i);
                                                    Pelicula p = (Pelicula) it.next();
                                                    System.out.println(p);
                                                    System.out.println();
                                                    i++;
                                                }
                                                correcto = false;
                                                do {
                                                    System.out.print("Seleccione el número de la película que desea alquilar(Introduzca 0 para salir): ");
                                                    int opcion = introduceDatos.introduceEntero();

                                                    if (opcion > 0 && opcion <= listaProducto.size()) {
                                                        pelicula = (Pelicula) listaProducto.get(opcion - 1);
                                                        //En caso de que la pelicula seleccionada no esté disponible se buscará
                                                        //una pelicula que SÍ lo esté, en caso de que no la haya, le
                                                        //dará al cliente la posibilidad de reservar
                                                        if (!pelicula.getEstado().equals(ProductoEnum.Disponible)) {
                                                            it = listaProducto.iterator();
                                                            while (it.hasNext() && !salir) {
                                                                Pelicula p = (Pelicula) it.next();
                                                                if (p.getEstado().equals(ProductoEnum.Disponible) && p.getTitulo().equals(pelicula.getTitulo()) && p.getTipo().equals(pelicula.getTipo())) {
                                                                    alquiler = new Alquiler();
                                                                    alquiler.altaAlquiler(cliente, p);
                                                                    salir = true;
                                                                    correcto = true;
                                                                } else {
                                                                    reservar = true;
                                                                }
                                                            }
                                                            if (reservar) {//Si la variable reservar = true, le dará al usuario la
                                                                //opción de reservar
                                                                System.out.println("La película seleccionada está actualmente alquilado");
                                                                Reserva.altaReserva(cliente, pelicula);
                                                            }//No hay else

                                                        }//else de si el producto seleccionado no está disponible
                                                        else {
                                                            alquiler = new Alquiler();
                                                            alquiler.altaAlquiler(cliente, pelicula);
                                                        }
                                                    }//si el usuario ha seleccionado salir
                                                    else if (opcion == 0) {
                                                        correcto = true;
                                                        opProd = -1;
                                                    } else {
                                                    }//en otro caso no se hace nada
                                                } while (!correcto);
                                            } else {
                                                System.out.println("No existe ninguna película con ese nombre");
                                            }
                                        } else if (texto.equals("0")) {
                                            opProd = -1;
                                        } else {
                                        }

                                        break;

//////////////////////////ALQULER DE VIDEO JUEGO//////////////////////////
                                    case 2: // Alquilar videojuego
                                        System.out.print("Introduzca el nombre del videojuego que desea alquilar(Introduzca 0 para salir): ");
                                        texto = introduceDatos.introduceString();
                                        System.out.println();
                                        if (texto.length() > 0 && !texto.equals("0")) {
                                            listaProducto = (ArrayList) VideojuegoJDBC.consultaVideojuegosNombre(texto);
                                            if (!listaProducto.isEmpty()) {
                                                it = listaProducto.iterator();
                                                Videojuego videojuego = new Videojuego();
                                                int i = 1;
                                                while (it.hasNext()) {
                                                    System.out.print(">> VIDEOJUEGO NÚMERO: " + i);
                                                    Videojuego v = (Videojuego) it.next();
                                                    System.out.println(v);
                                                    System.out.println();
                                                    i++;
                                                }
                                                correcto = false;
                                                do {
                                                    System.out.print("Seleccione el número del videojuego que desea alquilar(Introduzca 0 para salir): ");
                                                    int opcion = introduceDatos.introduceEntero();

                                                    if (opcion > 0 && opcion <= listaProducto.size()) {
                                                        videojuego = (Videojuego) listaProducto.get(opcion - 1);
                                                        //En caso de que la pelicula seleccionada no esté disponible se buscará
                                                        //una pelicula que SÍ lo esté, en caso de que no la haya, le
                                                        //dará al cliente la posibilidad de reservar
                                                        if (!videojuego.getEstado().equals(ProductoEnum.Disponible)) {
                                                            it = listaProducto.iterator();
                                                            while (it.hasNext() && !salir) {
                                                                Videojuego v = (Videojuego) it.next();
                                                                if (v.getEstado().equals(ProductoEnum.Disponible) && v.getTitulo().equals(videojuego.getTitulo()) && v.getTipo().equals(videojuego.getTipo())) {
                                                                    salir = true;
                                                                    alquiler = new Alquiler();
                                                                    alquiler.altaAlquiler(cliente, v);
                                                                } else {
                                                                    reservar = true;
                                                                }
                                                            }
                                                            if (reservar) {//Si la variable reservar = true, le dará al usuario la
                                                                //opción de reservar
                                                                System.out.println("El videojuego seleccionado está actualmente alquilado");
                                                                Reserva.altaReserva(cliente, videojuego);
                                                            }//No hay else

                                                        }//else de si el producto seleccionado no está disponible
                                                        else {
                                                            alquiler = new Alquiler();
                                                            alquiler.altaAlquiler(cliente, videojuego);
                                                        }
                                                    }//si el usuario ha seleccionado salir
                                                    else if (opcion == 0) {
                                                        correcto = true;
                                                        opProd = -1;
                                                    } else {
                                                    }//en otro caso no se hace nada
                                                } while (!correcto);
                                            } else {
                                                System.out.println("No existe ninguna película con ese nombre");
                                            }
                                        } else if (texto.equals("0")) {
                                            opProd = -1;
                                        } else {
                                        }
                                        break;
                                    default:
                                        System.out.println("[!] Opción incorrecta.");
                                }
                            } while (opProd != -1);
                        } else {
                            System.out.println("[!] No puede alquilar más productos. Actualmente tiene el número máximo de productos alquilados");
                        }
                    } else {                                                            // El usuario no puede alquilar
                        System.out.println("[!] El usuario no está disponible. Situación: " + cliente.getEstadoUsuario());
                        opUsu = 0;
                    }
                } else {
                    System.out.println("[!] El usuario no existe");
                }
            }
        } while (opUsu == -1);
    }

    /**
     * Reservar producto
     */
    private static void res_prod() {
        // TODO MIGUEL Comprobar que se puede reservar...comprobarReserva()
        // TODO MIGUEL Pedir usuario
        // TODO MIGUEL Selección de producto
        System.out.println("<< EN CONSTRUCCION >>");
    }

    /**
     * Devolver producto
     */
    private static void dev_prod() {
        // TODO MIGUEL Faltan métodos para devolver  ?
        //TODO CRISTINA: esta método está hecho, lo voy a colocar hoy (4/5/2011),
        //falta las cosas de videojuego que tiene que hacer Rafa OK
        // TODO MIGUEL Comprobar estado producto
        // TODO MIGUEL He modificado cosillas para que funcione correctamente

        boolean correcto = false;
        int codigo = -1;
        do {
            System.out.print(">>> Introduzca el código del producto(número del lateral): ");
            codigo = introduceDatos.introduceEntero();
            if (codigo != 0) {
                correcto = true;
            } else {
                System.out.println("[i] Tiene que introducir un código.");
            }
        } while (!correcto);

        correcto = false;
        do {
            System.out.println("[1] Película");
            System.out.println("[2] Videojuego");
            System.out.print(">>> Seleccione el tipo de producto: ");
            int opcion = introduceDatos.introduceEntero();

            switch (opcion) {
                case 1:
                    Pelicula pelicula = PeliculaJDBC.obtenerPeliculaPorId(codigo);
                    Alquiler.devolucionAlquiler(pelicula);
                    correcto = true;
                    break;
                case 2:
                    Videojuego videojuego = VideojuegoJDBC.obtenerVideojuegoPorId(codigo);
                    Alquiler.devolucionAlquiler(videojuego);
                    correcto = true;
                    break;
                default:
                    System.out.println("[!] Opción incorrecta.");
            }
        } while (!correcto);
    }

    /**
     * Consultar saldo
     */
    private static void cons_saldo() { // TODO MIGUEL Falta volver a pedir usuario si no existe
        Cliente cliente = null;

        System.out.print(">>> Usuario para consultar saldo: ");
        String dni = EntradaTextoStatic.leeCadena();

        // TODO MIGUEL Volver a pedir en caso de que el usuario no exista o la opción de salir
        if (!UsuarioJDBC.existeUsuarioRol(dni, Rol.Cliente)) {
            System.out.println("[!] El usuario no existe.");
        } else {
            cliente = Cliente.ConsultaClienteTienda(dni);
            System.out.println(cliente);
            System.out.println("[i] Saldo: " + cliente.getSaldo() + " €");
        }
    }

    //*********************************************************
    //  Administrador > Usuarios
    //*********************************************************
    /**
     * Buscar usuario
     */
    private static void buscar_usu() {
        // TODO MIGUEL Varios criterios de búsqueda ?
        boolean elegir = false;
        do {
            System.out.println(">>> Seleccione el usuario a buscar: ");
            System.out.println("[1] Cliente");
            System.out.println("[2] Administrador");
            System.out.print(">>> Introduzca el número correspondiente a la opción: ");
            int opcion = introduceDatos.introduceEntero();
            switch (opcion) {
                case 1: // Cliente
                    Cliente cliente = new Cliente();
                    try {
                        System.out.print(">>> Usuario: ");
                        String dni = EntradaTextoStatic.leeCadena();
                        cliente = Cliente.ConsultaClienteTienda(dni);
                        if (cliente == null) {
                            System.out.println("El cliente no existe");
                        } else {
                            System.out.println(cliente);
                        }
                    } catch (Exception e) {
                        System.out.println("Error al consultar usuario " + e.getMessage());
                    }

                    elegir = true;
                    break;
                case 2: // Usuario
                    Usuario usuario = new Usuario();
                    usuario = Usuario.consultaUsuarioTienda();
                    if (usuario == null) {
                        System.out.println("El usuario no existe");
                    } else {
                        System.out.println(usuario);
                    }
                    elegir = true;
                    break;
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
            }
        } while (!elegir);
    }

    /**
     * Alta usuario
     */
    private static void alta_usu() {
        // TODO MIGUEL Comprobar que el usuario no existe
        // TODO MIGUEL No puedo dar de alta a un Jefe si soy Administrador
        int tipoUsuario;
        boolean correcto = true;
        System.out.println("[1] Cliente");
        System.out.println("[2] Administrador");
        //System.out.println("[3] Jefe"); // TODO MIGUEL Controlar
//////////////////////////MODIFICAR JEFE\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        System.out.print(">>> Seleccione tipo de usuario: ");
        tipoUsuario = introduceDatos.introduceEntero();
        do {
            switch (tipoUsuario) {
                case 1:
                    Cliente cliente = new Cliente();
                    cliente.setRol(Rol.Cliente);
                    cliente.altaUsuario();
                    correcto = true;
                    break;
                case 2:
                    Administrador administrador = new Administrador();
                    administrador.setRol(Rol.Administrador);
                    administrador.altaUsuario();
                    correcto = true;
                    break;
                /*    case 3:
                Jefe jefe = new Jefe();
                jefe.setRol(Rol.Jefe);
                jefe.altaUsuario();
                break;
                 *
                 */
                default:
                    System.out.println("[!] La opción no es válida, pruebe de nuevo.\n");
            }
        } while (!correcto);
    }

    /**
     * Baja usuario
     */
    private static void baja_usu() {
        // TODO MIGUEL Comprobar que el usuario se puede dar de baja
        // TODO MIGUEL Cuidado a quién se da de baja, ni a mí mismo, ni a un Jefe si soy Administrador
        System.out.print(">>> Usuario: ");
        String dni = EntradaTextoStatic.leeCadena();

        if (!UsuarioJDBC.existeUsuario(dni)) {
            System.out.println(">>> El usuario no existe");
        } else {
            UsuarioJDBC.bajaUsuario(dni);
        }
    }

    /**
     * Modificación usuario
     */
    private static void mod_usu() {
        // TODO MIGUEL Comprobar que las modificaciones se pueden efectuar y no interfieren en algún proceso en marcha
        // TODO MIGUEL Cuidado al modificarme a mí mismo
        Cliente cliente = null;

        System.out.print(">>> Usuario: ");
        String dni = EntradaTextoStatic.leeCadena();

        if (!UsuarioJDBC.existeUsuario(dni)) {
            System.out.println(">>> El usuario no existe");
        } else {

            cliente = ClienteJDBC.obtenerClientePorDni(dni);
            if (cliente != null) {
                System.out.println("\n" + cliente);
                cliente.modificacionCliente();
            } else {
                System.out.println("El cliente introducido no existe");
            }
        }
    }

    /**
     * Desbloqueo usuario
     */
    private static void desbloq_usu() {
        // TODO MIGUEL Forzar un cambio de contraseña?
        // TODO MIGUEL Mostrar datos del usuario para comprobar que es ese, o pedir dos veces el código...
        System.out.print(">>> Usuario: ");
        String dni = EntradaTextoStatic.leeCadena();

        if (!UsuarioJDBC.existeUsuario(dni)) {
            System.out.println(">>> El usuario no existe");
        } else {
            UsuarioJDBC.desbloquearUsuario(dni);
        }
    }

    /**
     * Añadir saldo al usuario
     */
    private static void anyadir_saldo_usu() {
        boolean correcto = false;
        do {
            System.out.print(">>> Usuario(Introduzca 0 para salir): ");
            String dni = introduceDatos.introduceString();
            if (dni.length() > 0 && dni.length() <= 8) {

                Cliente cliente = Cliente.ConsultaClienteTienda(dni);
                correcto = true;

                if (cliente != null) {
                    if (cliente != null) {
                        boolean correcto2 = false;
                        do {
                            System.out.print("Saldo que desea añadir(Introduzca -1 para salir): ");
                            try {
                                float sal = introduceDatos.introduceFloat();
                                if (sal > 0) {
                                    cliente.anyadirSaldo(sal);
                                    correcto2 = true;
                                } else if (sal == -1) {
                                    correcto2 = true;
                                } else {
                                    System.out.println("Debe introducir una cantidad superior a 0");
                                }
                            } catch (Exception e) {
                                System.out.println("[!] Debe introducir un número");
                            }
                        } while (!correcto2);
                        correcto = true;
                    } else if (dni.equals("0")) {
                        correcto = true;
                    } else {
                        System.out.println("El cliente introducido no existe");
                    }
                } else {
                    System.out.println("[!] El usuario introducido no existe");
                }
            }
        } while (!correcto);
    }

    /**
     * Consultar saldo del usuario
     */
    private static void cons_saldo_usu() {
        boolean correcto = false;
        do {
            System.out.print(">>> Usuario(Introduzca 0 para salir): ");
            String dni = introduceDatos.introduceString();
            if (dni.length() > 0 && dni.length() <= 8 && !dni.equals("0")) {
                Cliente cliente = Cliente.ConsultaClienteTienda(dni);
                if (cliente != null) {
                    System.out.println("\nEl saldo actual del usuario: " + cliente.getNombre() + " es " + cliente.getSaldo() + " euros");
                } else {
                    System.out.println("[!] El usuario introducido no existe");
                }
                correcto = true;
            } else if (dni.equals("0")) {
                correcto = true;
            } else {
                System.out.println("Los datos introducidos no son correctos");
            }
        } while (!correcto);
    }

    /**
     * Ver reservas pendientes del usuario
     */
    private static void reservas_pendientes_usu() {
        Reserva.reservasPendientes();
    }

    /**
     * Alquila los productos reservados que están listos para alquilar por un cliente
     */
    private static void alquilar_producto_reservado() {
        System.out.print(">>>Usuario: ");

        String dni = introduceDatos.introduceString();
        System.out.println();

        if (!UsuarioJDBC.existeUsuarioRol(dni, Rol.Cliente)) {
            System.out.println("[!] El usuario introducido no exite");
        } else {
            Cliente cliente = ClienteJDBC.obtenerClientePorDni(dni);
            ArrayList lista = ReservaJDBC.reservaParaAlquilar(cliente);

            if (!lista.isEmpty()) {
                Iterator it = lista.iterator();
                int i = 1;
                while (it.hasNext()) {
                    System.out.println(">>> RESERVA NÚMERO " + i + " <<<");
                    Reserva reserva = (Reserva) it.next();
                    System.out.println(reserva);
                    System.out.println();
                    i++;
                }

                boolean correcto = false;
                do {
                    System.out.print("Seleccione el número del producto que desea alquilar(Introduzca 0 para salir): ");
                    int opcion = introduceDatos.introduceEntero();
                    if (opcion > 0 && opcion <= lista.size()) {

                        Reserva r = (Reserva) lista.get(opcion - 1);
                        Alquiler alquiler = new Alquiler();
                        alquiler.alquilarProductoReservado(r);
                        correcto = true;
                    } else if (opcion == 0) {
                        correcto = true;
                    } else {
                        System.out.println("Opción incorrecta");
                    }

                } while (!correcto);
            } else {
                System.out.println("No hay productos pendientes de ser alquilados");
            }
        }
    }

    /**
     * Listado de usuarios
     */
    private static void listado_usu() {
        Cliente.consultarClienteVideoClub();
    }

    //*********************************************************
    //  Administrador > Productos
    //*********************************************************
    /**
     * Alta producto
     * 
     */
    private static void alta_prod() {
        // TODO MIGUEL Comprobar que no se encuentra ya de alta
        int tipoProducto;
        System.out.println("[1] Película");
        System.out.println("[2] Videojuego");

        do {
            System.out.print(">>> Seleccione tipo de producto: ");
            tipoProducto = introduceDatos.introduceEntero();
        } while (tipoProducto > 2 || tipoProducto < 1);

        switch (tipoProducto) {
            case 1:
                Pelicula p = new Pelicula();
                p.altaProducto();
                break;
            case 2:
                Videojuego v = new Videojuego();
                v.altaProducto();
                break;
        }
    }

    /**
     * Baja producto
     * @author Rafa
     */
    private static void baja_prod() {
        int op = 0;
        do {
            System.out.println("[1] Película");
            System.out.println("[2] Videojuego");
            System.out.print(">>> Seleccione tipo de producto: ");
            op = introduceDatos.introduceEntero();
        } while (op > 2 || op < 1);
        switch (op) {
            case 1:
                Pelicula p = new Pelicula();
                p.bajaProducto();
                break;
            case 2:
                Videojuego v = new Videojuego();
                v.bajaProducto();
                break;
        }
    }

    /**
     * Modificación producto
     * @author Rafa
     */
    private static void mod_prod() {
        int op = 0;
        do {
            System.out.println("[1] Película");
            System.out.println("[2] Videojuego");
            System.out.print(">>> Seleccione tipo de producto: ");
            op = introduceDatos.introduceEntero();
        } while (op > 2 || op < 1);
        switch (op) {
            case 1:
                Pelicula p = new Pelicula();
                p.modificacionProducto();
                break;
            case 2:
                Videojuego v = new Videojuego();
                v.modificacionProducto();
                break;
        }
    }

    public static void stock_prod() {
        Ubicacion ubi = new Ubicacion();
        int op;
        do {
            System.out.println("--STOCK PRODUCTOS--");
            System.out.println("1.- Productos en Tienda");
            System.out.println("2.- Productos en Cajero");
            System.out.println("3.- SALIR");
            System.out.println("Escoge Opcion: ");
            op = introduceDatos.introduceEntero2();
        } while (op > 3 || op < 1);
        switch (op) {
            case 1:
                ubi.consultaUbicacionesTienda();
                break;
            case 2:
                ubi.consultaUbicacionesCajero();
                break;
        }

    }
    //*********************************************************
    //  Administrador > Alquileres
    //*********************************************************

    /**
     * Mostrar productos alquilados
     */
    private static void prod_alq() {
        Alquiler.productosAlquilado();
    }
    //*********************************************************
    //  Administrador > Reservas
    //*********************************************************

    /**
     * Alta reserva
     */
    private static void alta_reserv() {
        System.out.println("<< EN CONSTRUCCION >>");
    }

    /**
     * Baja reserva
     */
    private static void baja_reserv() {
        System.out.println("<< EN CONSTRUCCION >>");
    }

    /**
     * Modificación reserva
     */
    private static void mod_reserv() {
        System.out.println("<< EN CONSTRUCCION >>");
    }

    /**
     * Actualizar reservas
     */
    private static void act_reserv() {
        System.out.println("<< EN CONSTRUCCION >>");
    }

    /**
     * Alquilar productos reservados
     */
    private static void alq_prod_reserv() {
        System.out.println("<< EN CONSTRUCCION >>");
    }

    /**
     * Este método comprueba las reservas existen y en caso que algún usuario
     * se le haya pasado la fecha de reservar, está se cancelará
     */
    private static void actualizarReservas() {
        Reserva.actualizarReservas();
    }

    //*********************************************************
    //  Administrador > Tarifas
    //*********************************************************
    /**
     * Alta tarifa
     */
    private static void alta_tar() {
        Tarifa t = new Tarifa();
        t.altaTarifa();
    }

    /**
     * Baja tarifa
     */
    private static void baja_tar() {
        Tarifa t = new Tarifa();
        t.bajaTarifa();
    }

    /**
     * Modificación tarifa
     */
    private static void mod_tar() {
        Tarifa t = new Tarifa();
        t.modificacionTarifa();

    }

    /**
     * Alta proveedor     
     */
    private static void alta_prov() {
        Proveedor proveedor = new Proveedor();
        proveedor.altaProveedor();
    }

    /**
     * Baja proveedor
     */
    private static void baja_prov() {
        // TODO MIGUEL Ya incluído en modificación proveedores
        System.out.println("<< EN CONSTRUCCION >>");
    }

    /**
     * Modificar proveedor
     */
    private static void mod_prov() {
        //Proveedor.seleccionarTodosProveedores();
        boolean correcto = false;

        do {
            System.out.print("Introduzca el cif del proveedor(Introduzca 0 para salir): ");
            String tex = introduceDatos.introduceString();
            if (tex.length() > 0 && tex.length() <= 9 && !tex.equals("0")) {
                Proveedor proveedor = ProveedorJDBC.obtenerProveedor(tex);
                Proveedor.modificarProveedor(proveedor);
                correcto = true;
            } else if (tex.equals("0")) {
                correcto = true;
            } else {
                System.out.println("[!] Los datos introducidos son incorrectos");
            }
        } while (!correcto);
    }

    /**
     * Consultar proveedor
     */
    private static void cons_prov() {
        Proveedor.buscarProveedor(); //muestra todos los proveedores que contenga la palabra introducida
    }

    /**
     * Listar proveedores
     */
    private static void lista_prov() {
        System.out.println("<< EN CONSTRUCCION >>");
        Proveedor.seleccionarTodosProveedores();
    }

    //*********************************************************
    //  Administrador > Consultas
    //*********************************************************
    //*********************************************************
    //  Jefe > Pedidos
    //*********************************************************
    /**
     * Alta pedido
     */
    private static void alta_ped() {
        Pedido ped = new Pedido();
        ped.realizarPedido();
    }

    /**
     * Recepcionar pedido
     */
    private static void recep_ped() {
        Pedido pedido;
        int numPedido;
        do {
            System.out.print(">>> Introduzca el número de pedido: ");
            numPedido = introduceDatos.introduceEntero();
        } while (numPedido <= 0);

        pedido = PedidoJDBC.obtenerPedidoPorCodigo(numPedido);
        pedido.recepcionarPedido();
    }

    //*********************************************************
    //  Jefe > Franquicias
    //*********************************************************
    //*********************************************************
    //  Jefe > Informes
    //*********************************************************
    /************************************************************************
     * METODOS DE CONTABILIDAD
     ************************************************************************/
    /**
     * Muestra los beneficios netos obtenido en una fecha determinada
     */
    private static void obtener_beneficios_totales() {

        Date fechaInicio = null;
        Date fechaFin = null;
        String fecha = "";
        boolean correcto = false;

        do {
            System.out.print("Introduzca la fecha Inicio(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaInicio = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);



        correcto = false;
        do {
            System.out.print("Introduzca la fecha Fin(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaFin = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);


        int comp = fechaInicio.compareTo(fechaFin);
        if (comp <= 0) {
            System.out.println("El beneficio del periodo indicado");
            Double conta = Contabilidad.obtenerBeneficios(fechaInicio, fechaFin);

            System.out.println("\nSe ha obtenido los siguientes beneficios: " + conta + " euros");
            System.out.println();
        } else {
            System.out.println("La fecha de fin debe ser mayor que la de inicio");
        }
    }

    /**
     * Muestra todos los gasto e ingreso en una fecha determinada
     */
    private static void obtenerDetallesContabilidad() {

        Date fechaInicio = new Date();
        Date fechaFin = new Date();
        String fecha = "";
        boolean correcto = false;

        do {
            System.out.print("Introduzca la fecha Inicio(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaInicio = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);



        correcto = false;
        do {
            System.out.print("Introduzca la fecha Fin(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaFin = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);

        int comp = fechaInicio.compareTo(fechaFin);
        if (comp <= 0) {
            SortedSet lista = (SortedSet) Contabilidad.obtenerDetallesContabilidadPorFecha(fechaInicio, fechaFin);

            Iterator it = lista.iterator();
            System.out.println("\nDetalles contabilidad: ");
            while (it.hasNext()) {
                Contabilidad contabilidad = (Contabilidad) it.next();
                System.out.println(contabilidad);
            }
        } else {
            System.out.println("La fecha de fin debe ser mayor que la de inicio");
        }
    }

    private static void obtenerGastos() {

        Date fechaInicio = null;
        Date fechaFin = null;
        String fecha = "";
        boolean correcto = false;

        do {
            System.out.print("Introduzca la fecha Inicio(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaInicio = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);



        correcto = false;
        do {
            System.out.print("Introduzca la fecha Fin(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaFin = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);


        int comp = fechaInicio.compareTo(fechaFin);
        if (comp <= 0) {
            System.out.println("Los gastos del periodo introducido");
            Gasto.obtenerGastosPorFecha(fechaInicio, fechaFin);
        } else {
            System.out.println("La fecha de fin debe ser mayor que la de inicio");
        }
    }

    private static void obtenerIngresos() {

        Date fechaInicio = null;
        Date fechaFin = null;
        String fecha = "";
        boolean correcto = false;

        do {
            System.out.print("Introduzca la fecha Inicio(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaInicio = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);



        correcto = false;
        do {
            System.out.print("Introduzca la fecha Fin(dd/mm/aaaa): ");
            fecha = introduceDatos.introduceString();

            if (Pattern.matches("\\d\\d/\\d\\d/\\d\\d\\d\\d", fecha)) {
                fechaFin = UtilFecha.obtenerFecha(fecha);
                correcto = true;
            } else {
                System.out.println("[!] Error en la fecha ");
            }
        } while (!correcto);


        int comp = fechaInicio.compareTo(fechaFin);
        if (comp <= 0) {
            System.out.println("Los ingresos del periodo introducido");
            Ingreso.obtenerIngresoPorFecha(fechaInicio, fechaFin);
        } else {
            System.out.println("La fecha de fin debe ser mayor que la de inicio");
        }
    }
    /************************************************************************
     * METODOS AUXILIARES
     ************************************************************************/
    /**
     * Usado para seleccionar un producto en concreto
     * 
     * @return codigo del producto seleccionado
     */
//    private static int seleccionarProducto(int prod) { // TODO MIGUEL Faltan otras modalidades de selección
//        int codigo = -1;
//        String cad = "";
//        int mod = -1;
//
//        // TODO MIGUEL Considerar las siguientes modalidades
//        /*
//         * Tipo de producto y formato
//         * Búsqueda por título de entre los disponibles
//         * Selección a través de un listado
//         * Introduciendo directamente el código de producto > se supone que es el que se usa, el código viene en la caja
//         *
//         */
//
//        switch (prod) {
//            case 1: // Pelicula
//                // TODO MIGUEL Comprobar que existe
//                System.out.print(">>> Código de película: ");
//                codigo = EntradaTextoStatic.leeEntero();
//
//                break;
//            case 2: // Videojuego
//                // TODO MIGUEL Como en película
//                System.out.print(">>> Código de videojuego: ");
//                codigo = EntradaTextoStatic.leeEntero();
//                break;
//            default:
//                break;
//        }
//        return codigo;
//    }
}
